package city.spring.modules.work.action.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * 排班结果项（这一天的这个班次有哪些人员在上班）
 *
 * @author HouKunLin
 * @date 2020/6/5 0005 14:17
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResultItem<SHIFT, USER> {
    /**
     * 该班次的人员列表
     */
    private List<AbstractPlanUser<USER>> users = new ArrayList<>();
    /**
     * 限制该班次的人员数量
     */
    private int size;
    /**
     * 被锁定班次上班人员数量
     */
    private boolean lockSize;
    /**
     * 上班日期（一个代表日期唯一的key值）
     */
    private LocalDate day;
    /**
     * 此班次
     */
    private AbstractPlanShift<SHIFT> shift;

    public ResultItem(LocalDate day, AbstractPlanShift<SHIFT> shift) {
        this.day = day;
        setShift(shift);
    }

    private void setShift(AbstractPlanShift<SHIFT> shift) {
        this.shift = shift;
        // 获取该班次的上班人数，先获取自动配置的上班人数，如果未自动配置，则获取默认限定的上班人数（同时锁定当前班次不能更改上班人数）
        int workNumber = shift.getAutoWorkNumber();
        if (workNumber == -1) {
            workNumber = shift.getWorkNumber();
        }
        this.size = workNumber;
        if (shift.getWorkNumber() != -1) {
            this.lockSize = true;
        }
    }

    public Object getShiftKey() {
        return shift.getKey();
    }

    /**
     * 判断是否能够继续安排上班人员（当前班次人数是否未达到上限）
     *
     * @return true 是， false 否（无法继续安排人员）
     */
    public boolean canAdd() {
        return size > users.size();
    }

    /**
     * 向该班次添加一个值班用户
     *
     * @param user 欲添加的用户
     */
    public void addUser(AbstractPlanUser<USER> user) {
        users.add(user);
        user.usePeople();
    }
}
